/* Compiler_GCC.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 12/30/2009
 *  Last Modified   : 09/04/2014
 * 
 */

#pragma once
#ifndef ymp_Compiler_GCC_H
#define ymp_Compiler_GCC_H
namespace ymp{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Disable Bad/Buggy Compilers
#ifndef __INTEL_LLVM_COMPILER
#if (defined __GNUC__ && __GNUC__ < 10) || (__GNUC__ == 10 && __GNUC_MINOR__ < 3)
#error "GCC 10.3 or higher is required."
//  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91341
//  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81294
//  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83250
#endif
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define YM_NO_INLINE        __attribute__ ((noinline))
#define YM_FORCE_INLINE     inline __attribute__ ((always_inline))
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Restrict
template <typename type> using r_ptr  = type *__restrict__;
template <typename type> using c_ptr  = type const*__restrict__;
template <typename type> using r_ref  = type &__restrict__;
template <typename type> using c_ref  = type const&__restrict__;
template <typename type> using r_rref = type &&__restrict__;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Dynamic Linking
#ifdef YMP_STANDALONE
#define YMP_EXPORT
#else
//#error "Dynamic linking not yet supported."
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Inline Assembly
#define YMP_INLINEASM_ATT
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//  Warnings
#pragma GCC diagnostic ignored "-Wunused-function"
#pragma GCC diagnostic ignored "-Wunused-variable"
#pragma GCC diagnostic ignored "-Wunused-value"
#pragma GCC diagnostic ignored "-Wignored-attributes"
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
#ifdef __INTEL_LLVM_COMPILER
#pragma GCC diagnostic ignored "-Wconstant-conversion"
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
#endif
